#include "loadandvalidateproxytask.h"
#include "proxyvalidationtask.h"

LoadAndValidateProxyTask::LoadAndValidateProxyTask(const QVector<ProxyServerData> &vPsd,QObject *parent)
    : QObject{parent}
{
    threadPool.setMaxThreadCount(m_maxThreadNum); // 限制线程池的最大线程数
    m_stopThread = false;
    m_allProxyServer = vPsd;

}

LoadAndValidateProxyTask::~LoadAndValidateProxyTask()
{
    qDebug()<<__FUNCTION__;
}
void LoadAndValidateProxyTask::run()
{
    // qDebug()<<m_allProxyServer.size();
    // batchValidateProxies(m_allProxyServer);
    qDebug()<<__FUNCTION__<<"开始LoadAndValidateProxyTask线程的run";
    int activeThreads;
    int totalNum = m_allProxyServer.size();
    for (int i = 0; i < totalNum; i++) {
        if(m_stopThread )
        {
            qDebug()<<"提前终止线程,开始等待剩下任务完成";
            threadPool.clear();
            threadPool.waitForDone(-1);// 等待所有任务完成
            qDebug()<<"提前终止线程,剩下任务已完成";
            emit taskInterrupt();
            QThread::sleep(1);
            delete this;
            return;
        }

        activeThreads = threadPool.activeThreadCount();

        if(activeThreads==m_maxThreadNum)
        {
            qDebug()<<"已达到线程池上限,开始休眠1s: "<< activeThreads<<i;
            QThread::sleep(1);
            i--;
            continue;
        }

        ProxyServerData proxy= m_allProxyServer[i];
        ProxyValidationTask *task = new ProxyValidationTask(proxy);
        connect(task, &ProxyValidationTask::proxyResult,  [this]( QString proxyStr, QString retStr){
                        //qDebug()<<__FUNCTION__<<"in LoadAndValidateProxyTask recv result  from ProxyValidationTask"<<retStr;
                        emit result(proxyStr, retStr); // 假设result是LoadAndValidateProxyTask的一个信号
                });
        threadPool.start(task);

    }
    qDebug()<<"任务已发送完成，开始等待队列所有任务完成";
    threadPool.waitForDone(-1);// 等待所有任务完成
    qDebug()<<"所有任务已经完成,退出LoadDomainQueryTask的run";
    QThread::sleep(1);//当请求较少时，避免请求发送完成，入库线程的队列还没有数据的情况，会导致提前退出。
    emit taskFinish();
    delete this;

}
void LoadAndValidateProxyTask::stopThread()
{

    threadPool.clear();
    m_stopThread = true;
    qDebug()<<threadPool.activeThreadCount();
    emit finishedTask();
}
void LoadAndValidateProxyTask::batchValidateProxies(const QVector<QString>& proxies)
{
    // int batchSize = 20; // 每批次验证的数量
    // for (int i = 0; i < proxies.size(); i += batchSize) {
    //     if(m_stopThread )
    //     {
    //         qDebug()<<"停止代理验证，终止线程";
    //         return;
    //     }
    //     int end = qMin(i + batchSize, proxies.size());
    //     for (int j = i; j < end; ++j) {
    //         QString proxy = proxies[j];

    //         ProxyValidationTask *task = new ProxyValidationTask(proxy);
    //         // 确保连接的槽函数与信号匹配
    //         connect(task, &ProxyValidationTask::validationResult,
    //                 this, [this, proxy](const QString &validatedProxy, QString retStr){
    //                     emit result(validatedProxy, retStr); // 假设result是LoadAndValidateProxyTask的一个信号
    //                     // 或者直接处理结果，例如：
    //                     // handleValidationResult(validatedProxy, success);
    //                 });
    //         connect(this, &LoadAndValidateProxyTask::finishedTask, task, &ProxyValidationTask::stopTask);

    //         threadPool.start(task);

    //     }
    //     //emit progress(i + batchSize, proxies.size()); // 更新进度
    // }
}
void LoadAndValidateProxyTask::batchValidateProxies(const QVector<ProxyServerData>& proxies)
{
    // int batchSize = 20; // 每批次验证的数量
    // for (int i = 0; i < proxies.size(); i += batchSize) {
    //     if(m_stopThread )
    //     {
    //         qDebug()<<"停止代理验证，终止线程";
    //         return;
    //     }
    //     int end = qMin(i + batchSize, proxies.size());
    //     for (int j = i; j < end; ++j) {
    //         ProxyServerData proxy = proxies[j];
    //         ProxyValidationTask *task = new ProxyValidationTask(proxy);
    //         // 确保连接的槽函数与信号匹配
    //         connect(task, &ProxyValidationTask::validationResult,
    //                 this, [this, proxy](const QString &validatedProxy,QString retStr){
    //                     emit result(validatedProxy, retStr); // 假设result是LoadAndValidateProxyTask的一个信号
    //                     // 或者直接处理结果，例如：
    //                     // handleValidationResult(validatedProxy, success);
    //                 });
    //         connect(this, &LoadAndValidateProxyTask::finishedTask, task, &ProxyValidationTask::stopTask);
    //         emit started(proxy.proxyaddr);
    //         threadPool.start(task);
    //     }
    //     //emit progress(i + batchSize, proxies.size()); // 更新进度
    // }
}
